package com.mjf.thread;

/**
 * 线程方法
 */
public class ThreadMethod01 {
    public static void main(String[] args) throws InterruptedException {

        T t = new T();

        // 设置线程名
        t.setName("子线程");

        // 设置线程优先级
        t.setPriority(8);

        t.start();

        // 主线程打印5次 hi,然后就中断子线程的休眠
        for(int i = 0; i < 5; i++) {
            Thread.sleep(1000);
            System.out.println("hi " + i);
        }

        // getPriority 获取线程的优先级
        System.out.println(t.getName() + " 线程的优先级 =" + t.getPriority());

        /*
        通知线程应该中断了，具体到底中断还是继续运行，应该由被通知的线程自己处理。

        具体来说，当对一个线程，调用 interrupt() 时：
            1） 如果线程处于被阻塞状态（例如处于sleep, wait, join 等状态），那么线程将立即退出被阻塞状态，
            并抛出一个InterruptedException异常。
            2）如果线程处于正常活动状态，那么会将该线程的中断标志设置为 true，仅此而已。
            被设置中断标志的线程将继续正常运行，不受影响。

        也就是说，一个线程如果有被中断的需求，那么就可以这样做。
            1）在正常运行任务时，经常检查本线程的中断标志位（Thread.isInterrupted()），如果被设置了中断标志就自行停止线程。
            2)在调用阻塞方法时正确处理InterruptedException异常。（例如，catch异常后就结束线程。）
         */
        t.interrupt();

        System.out.println("主线程结束了");

    }
}

class T extends Thread {
    @Override
    public void run() {
        while (true) {
            for (int i = 0; i < 10; i++) {
                // getName 获取线程名
                System.out.println(Thread.currentThread().getName() + "  吃包子~~~~" + i);
            }
            try {
                System.out.println(Thread.currentThread().getName() + " 休眠中~~~");
                Thread.sleep(20000);
            } catch (InterruptedException e) {
                // 当该线程执行到一个 interrupt 方法时，就会 catch 一个 异常, 可以加入自己的业务代码
                System.out.println(Thread.currentThread().getName() + "被 interrupt了");
            }
        }
    }
}